package controller;

import view.IHM;
import material.Material;
import model.Constants;
import model.Engine;
import commands.Command;

/**
 * Classe d'implementation du controlleur du metronome.
 */
public class ControllerImpl implements Controller {

	private Command[] buttonsCommands;		// Commandes pour agir suite a une pression sur un bouton du clavier
	private Command[] displayerCommands;	// Commandes pour mettre l'afficheur a jour
	
	private Engine engine;					// Le moteur associe au controleur
	private IHM ihm;						// L'IHM associee au controleur
	
	@Override
	public void setButtonsCommands(Command[] buttonsCommands) {
		this.buttonsCommands = buttonsCommands;
	}
	
	@Override
	public void setDisplayerCommands(Command[] displayerCommands) {
		this.displayerCommands = displayerCommands;
	}
	
	@Override
	public void setEngine(Engine engine) {
		this.engine = engine;
	}
	
	@Override
	public void setIHM(IHM ihm) {
		this.ihm = ihm;
	}

	@Override
	public void buttonPressed(int buttonID) {
		buttonsCommands[buttonID-1].execute();
	}
	
	@Override
	public void wheelPositionChanged(float wheelPosition) {
		if(wheelPosition >= 0.0 && wheelPosition <= 1.0) {
			engine.setTempo((int)(40 + (wheelPosition * 200)));
		}
	}
	
	@Override
	public void tempoChanged(int tempo) {
		Material.MaterialInstance().getDisplayer().displayTempo(tempo);
	}
	
	@Override
	public void beatTime() {
		Material.MaterialInstance().getDisplayer().turnOnLed(Constants.DEFAULT_TIME_LED);
		Material.MaterialInstance().getClock().activateAfterTime(displayerCommands[0], 100);
	}

	@Override
	public void beatBar() {
		Material.MaterialInstance().getDisplayer().turnOnLed(Constants.DEFAULT_BAR_LED);
		Material.MaterialInstance().getClock().activateAfterTime(displayerCommands[1], 100);
		Material.MaterialInstance().getSoundEmitter().emitClick();
	}

	@Override
	public void disableStart() {
		ihm.disableStart();
	}

	@Override
	public void disableStop() {
		ihm.disableStop();
	}

	@Override
	public void disableTimesPerBarDec() {
		ihm.disableTimesPerBarDec();
	}

	@Override
	public void disableTimesPerBarInc() {
		ihm.disableTimesPerBarInc();
	}

	@Override
	public void enableStart() {
		ihm.enableStart();
	}

	@Override
	public void enableStop() {
		ihm.enableStop();
	}

	@Override
	public void enableTimesPerBarDec() {
		ihm.enableTimesPerBarDec();
	}

	@Override
	public void enableTimesPerBarInc() {
		ihm.enableTimesPerBarInc();
	}
	
}
